#ifndef __COMPLEJO_H__
#define __COMPLEJO_H__

#include <iostream>
using namespace std;
//! \file tcomplejo.h
//! \brief Cabeceras de la clase TComplejo

//! \class TComplejo
/*!	\brief Clase que construye los numeros complejos*/

class TComplejo
{
	public:
		//! \brief Constructor por defecto de TComplejo
		/*!	Construye un Comlejo con ambos argumentos a 0*/
		TComplejo (double = 0, double = 0);
		
		//! \brief Constructor de copia
		/*!	Construye un Complejo a partir de otro.*/
		TComplejo (const TComplejo&);
		
		//! \brief Destructor
		/*!	Hace que ambos argumentos del complejo sean 0.*/
		~TComplejo();
		
		//! \brief Operator=
		/*! Asigna un complejo a otro.*/
		TComplejo& operator= (const TComplejo&);
		
		//! \brief Operator+
		/*!	Hace posible la operacion suma entre complejos.*/
		TComplejo operator+ (const TComplejo&);
		
		//! \brief Operator-
		/*!	Hace posible la operacion resta entre complejos.*/
		TComplejo operator- (const TComplejo&);
		
		//! \brief Operator*
		/*!	Hace posible la operacion multiplicacion entre complejos.*/
		TComplejo operator* (const TComplejo&);
		
		//! \brief Operator+ con double
		/*!	Suma al argumento real el doble que se pasa por parametro.*/
		TComplejo operator+ (const double);
		
		//! \brief Operator- con double
		/*!	Resta al argumento real el doble que se pasa por parametro.*/
		TComplejo operator- (const double);
		
		//! \brief Operator* con double
		/*!	Multiplica al argumento real el doble que se pasa por parametro.*/
		TComplejo operator* (const double);
		
		//! \brief Operator+ con double por la izquierda
		/*!	Suma al argumento real el doble que se pasa por parametro.*/
		friend TComplejo operator+ (const double ,const TComplejo&);
		
		//! \brief Operator- con double por la izquierda
		/*!	Resta al argumento real el doble que se pasa por parametro.*/
		friend TComplejo operator- (const double ,const TComplejo&);
		
		//! \brief Operator* con double por la izquierda
		/*!	Multiplica al argumento real el doble que se pasa por parametro.*/
		friend TComplejo operator* (const double ,const TComplejo&);
		
		//! \brief Operator ==
		/*! Devuelve true si ambos complejos son iguales.*/
		bool operator== (const TComplejo&) const;
		
		//! \brief Operator <
		/*! Devuelve true si el elemento izquierdo es menor que el derecho segun modulo, parte real y parte imaginaria.*/		
		bool operator< (const TComplejo&) const;

		//! \brief Operator >
		/*! Devuelve true si el elemento izquierdo es mayor que el derecho segun modulo, parte real y parte imaginaria.*/		
		bool operator> (const TComplejo &c) const;
		
		//! \brief Operator !=
		/*! Devuelve true si ambos complejos son distintos.*/
		bool operator!= (const TComplejo&) const; 
		double Re() const;
		double Im() const;
		void Re(const double);
		void Im(const double);
		double Arg() const;
		double Mod() const;
		friend ostream& operator<<(ostream &, const TComplejo &);
	private:
		double re;
		double im;

};
#endif
